﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Xml;
using Practico2.Business;
using Practico2.DataTypes;
using System.Text;

namespace Practico2.WebAccess
{
    public partial class PortalWeb : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        /// <summary>
        /// Obtiene las ciudades que comienzan con el termino indicado (case insensitive)
        /// </summary>
        /// <param name="term"></param>
        /// <returns></returns>
        [WebMethod]
        public static string FiltrarCiudades(String term)
        {
            List<String> busqueda = CiudadManager.BuscarCiudades(term);
            String result = "{\"terms\":[";
            foreach (String nombreCiudad in busqueda)
            {
                result += "\"" + nombreCiudad + "\",";
            }
            // quitamos la ultima ,
            result = result.Substring(0, result.Length - 1);
            result += "]}";
            return result;
        }

        /// <summary>
        /// Dado el string que representa la ciudad seleccionada devuelvo un objeto json con 
        /// la abreviacion del pais, el nombre de la ciudad y las coordenadas
        /// </summary>
        /// <param name="selectedCity"></param>
        /// <returns></returns>
        [WebMethod]
        public static string ObtenerCiudadData(String selectedCity)
        {
            // selected city es la ciudad seleccionada en el autocomplete, por lo tanto es de la forma
            // "nombrePais, nombreCiudad" que es lo que devuelve el FiltrarCiudades
            String[] cityAndCountry = selectedCity.Split(new Char[]{','});
            if (cityAndCountry.Length == 2)
            {
                // obtengo las partes del texto seleccionado por el usuario
                String countryName = cityAndCountry[0];
                String cityName = cityAndCountry[1];
                // obtengo el pais y ciudad especificos
                DTPais pais = PaisManager.ObtenerPaiseSegunNombre(countryName.Trim());
                DTCiudad ciudad = CiudadManager.ObtenerCiudadSegunNombre(cityName.Trim());

                // obtengo los datos del tiempo para la ciudad
                String weatherUrl = "http://weather.service.msn.com/data.aspx?weadegreetype=C&culture=es-ES&weasearchstr={0}";
                XmlDocument xmlRss = new XmlDocument();
                xmlRss.Load(string.Format(weatherUrl, ciudad.NombreCiudad + "," + pais.AbreviacionPais));
                // obtengo un json a partir del xml (sin las propiedades ni nada...)
                String jsonText = getWeatherAsJSON(xmlRss);


                if (pais != null && ciudad != null)
                {
                    String result = "{";
                    result += "\"country\":\"" + pais.AbreviacionPais + "\",";
                    result += "\"cityName\":\"" + ciudad.NombreCiudad + "\",";
                    result += "\"lon\":\"" + ciudad.LongitudCiudad + "\",";
                    result += "\"lat\":\"" + ciudad.LatitudCiudad + "\",";
                    result += "\"weather\":" + jsonText + "";
                    result += "}";

                    return result;
                }
            }
            return "";
        }

        private static string getWeatherAsJSON(XmlDocument xmlRss)
        {
            string xmlRoot = "/weatherdata/weather";
            xmlRss.SelectSingleNode(xmlRoot);
            String Fecha = xmlRss.SelectSingleNode(xmlRoot + "/current").Attributes["date"].InnerText;
            String Condicion = xmlRss.SelectSingleNode(xmlRoot+"/current").Attributes["skytext"].InnerText;
            String Code = xmlRss.SelectSingleNode(xmlRoot + "/current").Attributes["skycode"].InnerText;
            String Temp = xmlRss.SelectSingleNode(xmlRoot+"/current").Attributes["temperature"].InnerText;
            String Humedad = xmlRss.SelectSingleNode(xmlRoot+"/current").Attributes["humidity"].InnerText;
            String Viento = xmlRss.SelectSingleNode(xmlRoot + "/current").Attributes["winddisplay"].InnerText;
            String Sensacion = xmlRss.SelectSingleNode(xmlRoot + "/current").Attributes["feelslike"].InnerText;


            string result = "{";
            result += "\"skytext\":\"" + Condicion + "\",";
            result += "\"skycode\":\"" + Code + "\",";
            result += "\"temperature\":\"" + Temp+ "\",";
            result += "\"humidity\":\"" + Humedad + "\",";
            result += "\"winddisplay\":\"" + Viento + "\",";
            result += "\"feelslike\":\"" + Sensacion + "\",";
            result += "\"date\":\"" + Fecha + "\"";
            result += "}";

            return result;
        }


        [WebMethod]
        public static String ObtenerNoticiasCiudad(String selectedCity)
        {
            String result = "{";
            result += "\"noticias\":[";

            String[] cityAndCountry = selectedCity.Split(new Char[] { ',' });
            if (cityAndCountry.Length == 2)
            {
                // obtengo las partes del texto seleccionado por el usuario
                String countryName = cityAndCountry[0];
                String cityName = cityAndCountry[1];
                // obtengo el pais y ciudad especificos
                //DTPais pais = PaisManager.ObtenerPaiseSegunNombre(countryName.Trim());
                DTCiudad ciudad = CiudadManager.ObtenerCiudadSegunNombre(cityName.Trim());

                List<DTNoticia> noticias = NoticiasManager.ObtenerNoticiasPorCiudad(ciudad.IdCiudad);
                foreach (DTNoticia not in noticias)
                {
                    result += "{";
                    result += " \"noticia\":{";
                    result += "      \"titulo\":\"" + not.TituloNoticia + "\",";
                    result += "     \"descripcion\":\"" + not.DescripcionNoticia + "\",";
                    result += "     \"fecha\":\"" + not.FechaNoticia.ToShortDateString() + "\"";
                    result += " }";
                    result += "},";
                }

                if(noticias.Capacity > 0){
                    // quito la coma de la ultima noticia
                    result = result.Substring(0, result.Length - 1);
                }

            }
            // termino el array y la noticia
            result += "]}";

            return result;
        }
    }
}